/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.ufrn.engcomp.pds.helloopc.modelo.persistencia;

import br.ufrn.engcomp.pds.helloopc.modelo.dominio.IEntidade;
import java.util.List;

/**
 *
 * @author ufrn
 */
public class GenericDAO implements IDAO {

    @Override
    public void inserir(IEntidade entidade) {
        boolean transacaoEmAndamento = isTransactionActive();

        if (!transacaoEmAndamento) {
            PersistenceUtil.currentEntityManager().getTransaction().begin();
        }

        PersistenceUtil.currentEntityManager().persist(entidade);

        if (!transacaoEmAndamento) {
            PersistenceUtil.currentEntityManager().getTransaction().commit();
        }
    }

    @Override
    public void inserir(List<IEntidade> entidades) {
        boolean transacaoEmAndamento = isTransactionActive();

        if (!transacaoEmAndamento) {
            PersistenceUtil.currentEntityManager().getTransaction().begin();
        }

        for (IEntidade entidade : entidades) {
            atualizar(entidade);
        }

        if (!transacaoEmAndamento) {
            PersistenceUtil.currentEntityManager().getTransaction().commit();
        }
    }

    @Override
    public void atualizar(IEntidade entidade) {
        boolean transacaoEmAndamento = isTransactionActive();

        if (!transacaoEmAndamento) {
            PersistenceUtil.currentEntityManager().getTransaction().begin();
        }

        PersistenceUtil.currentEntityManager().persist(entidade);

        if (!transacaoEmAndamento) {
            PersistenceUtil.currentEntityManager().getTransaction().commit();
        }
    }

    @Override
    public void atualizar(List<IEntidade> entidades) {
        boolean transacaoEmAndamento = isTransactionActive();

        if (!transacaoEmAndamento) {
            PersistenceUtil.currentEntityManager().getTransaction().begin();
        }

        for (IEntidade entidade : entidades) {
            atualizar(entidade);
        }

        if (!transacaoEmAndamento) {
            PersistenceUtil.currentEntityManager().getTransaction().commit();
        }
    }

    @Override
    public void remover(IEntidade entidade) {
        boolean transacaoEmAndamento = isTransactionActive();

        if (!transacaoEmAndamento) {
            PersistenceUtil.currentEntityManager().getTransaction().begin();
        }

        PersistenceUtil.currentEntityManager().remove(entidade);

        if (!transacaoEmAndamento) {
            PersistenceUtil.currentEntityManager().getTransaction().commit();
        }
    }

    @Override
    public void remover(List<IEntidade> entidades) {
        boolean transacaoEmAndamento = isTransactionActive();

        if (!transacaoEmAndamento) {
            PersistenceUtil.currentEntityManager().getTransaction().begin();
        }

        for (IEntidade entidade : entidades) {
            remover(entidade);
        }

        if (!transacaoEmAndamento) {
            PersistenceUtil.currentEntityManager().getTransaction().commit();
        }
    }

    @Override
    public void refresh(IEntidade entidade) {
        PersistenceUtil.currentEntityManager().refresh(entidade);
    }

    @Override
    public void refresh(List<IEntidade> entidades) {
        for (IEntidade entidade : entidades) {
            refresh(entidade);
        }
    }

    @Override
    public IEntidade buscarPorID(Class classeEntidade, Object id) {
        return (IEntidade)PersistenceUtil.currentEntityManager().find(classeEntidade, id);
    }

    @Override
    public List<IEntidade> buscarTodos(Class classeEntidade) {
        return (List<IEntidade>)PersistenceUtil.currentEntityManager().createQuery("SELECT e FROM " + classeEntidade.getSimpleName() + " e", classeEntidade).getResultList();
    }

    @Override
    public void beginTransaction() {
        PersistenceUtil.currentEntityManager().getTransaction().begin();
    }

    @Override
    public void commitTransaction() {
        PersistenceUtil.currentEntityManager().getTransaction().commit();
    }

    @Override
    public void rollbackTransaction() {
        PersistenceUtil.currentEntityManager().getTransaction().rollback();
    }

    private boolean isTransactionActive() {
        return PersistenceUtil.currentEntityManager().getTransaction().isActive();
    }

    /*private Class<T> getClasse() {
        return (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    }*/

}
